package com.yww.webSocket;

import org.springframework.messaging.simp.annotation.SendToUser;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;


@ServerEndpoint(value = "/chat-room/{username}")
@Component
public class ChatRoomServerEndpoint extends ServerEndpointExporter {
    //存放所有在线用户，定期检查是否在线，不是的话移除
    private static Map<String, Session> map = new ConcurrentHashMap<>();

    private  static List<String> names=new ArrayList<String>();
    private String username;


    /**
     * @param username 路径参数
     * @param session  会话
     */
    @OnOpen
    public void openSession(@PathParam("username") String username, Session session) {
        map.put(session.getId(), session);
        //群发信息
        sendTextAll( username + "加入聊天室！");
        RemoteEndpoint.Basic basicRemote = session.getBasicRemote();



    }

    /**
     * 服务端发送消息给前端时调用 *
     *
     * @param username
     * @param session
     * @param message
     */
    @OnMessage
    public void onMessage(@PathParam("username") String username, Session session, String message){
        sendTextAll(username + "：" + message);
    }

    /**
     * 客户端关闭 WebSocket 连接时
     *
     * @param username
     * @param session
     */
    @OnClose
    public void onClose(@PathParam("username") String username, Session session){
// 将当前用户移除
        map.remove(session.getId());
// 给所有存活的用户发送消息
        sendTextAll("用户【" + username +"】离开聊天室！");
    }


    /**
     * 向指定 Session( 用户 ) 发送 message
     *
     * @param session
     * @param message
     */
    @SendToUser
    private void sendText(Session session, String message) {
        // 发送消息对象
        RemoteEndpoint.Basic basicRemote = session.getBasicRemote();
        try {
            // 发送消息
            basicRemote.sendText(message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 历所有存活的用户，并发送消息（ PS ：就是广播消息）
     *
     * @param message
     */
    private void sendTextAll(String message) {
        //找到所有在线用户的编号，放在迭代器中
        Iterator<String> sids = map.keySet().iterator();
        while (sids.hasNext()) {
            String sid = sids.next();
            Session session = map.get(sid);
            //像指定用户发信息
            this.sendText(session, message);
        }
    }
}
